package com.smart.dao;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

public class Page implements Serializable {
    private static int DEFUALT_PAGE_SIZE = 20;
    private int pageSize = DEFUALT_PAGE_SIZE; //每页的记录数
    private long start; // 当前页第一条数据在List中的位置,从0开始
    private List data; // 当前页中存放的记录,类型一般为List
    private long totalCount; // 总记录数

    public Page() {
        this(0, 0, DEFUALT_PAGE_SIZE, new ArrayList());
    }

    /**
     * @param start 本页数据在数据库中的起始位置
     * @param totalCount 数据库中总记录条数
     * @param pageSize 本页容量
     * @param data 本页包含的数据
     */
    public Page(long start, long totalCount, int pageSize, List data) {
        this.start = start;
        this.totalCount = totalCount;
        this.pageSize = pageSize;
        this.data = data;
    }


    /**
     * 取页数
     */
    public long getTotalPageCount() {
        if (totalCount % pageSize == 0) {
            return totalCount / pageSize;
        }
        else {
            return totalCount / pageSize + 1;
        }
    }

    /**
     * 取总记录数
     */
    public long getTotalCount() {
        return totalCount;
    }

    /**
     * 每页的容量
     */
    public int getPageSize() {
        return pageSize;
    }

    /**
     *
     */
    public long getStart() {
        return start;
    }

    /**
     * 取当前页的记录
     */
    public List getResult() {
        return data;
    }

    /**
     * @return 取当前页码
     */
    public long getCurrentPageNo() {
        return start / pageSize + 1;
    }

    /**
     * @return 是否有下一页
     */
    public boolean isHasNextPage() {
        return this.getCurrentPageNo() < this.getTotalPageCount();
    }

    /**
     * @return 是否有上一页
     */
    public boolean isHasPreviousPage() {
        return this.getCurrentPageNo() > 1;
    }

    /**
     * 获取任一页第一条数据在数据集的位置
     * @param pageNo
     * @return
     */
    protected static int getStartOfPage(int pageNo) {
        return getStartOfPage(pageNo, DEFUALT_PAGE_SIZE);
    }

    /**
     * 获取任一页第一条数据在数据集的位置
     * @param pageNo
     * @param pageSize
     * @return
     */
    public static int getStartOfPage(int pageNo, int pageSize) {
        return (pageNo - 1) * pageSize;
    }

}
